package br.com.mrh.bean;

import java.util.Locale;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import br.com.mrh.entity.Usuario;
import br.com.mrh.entity.UsuarioAlteraSenha;
import br.com.mrh.exception.MRHAlertaException;
import br.com.mrh.exception.MRHErroException;
import br.com.mrh.service.UsuarioService;
import br.com.mrh.util.Mensagens;

/**
 * Classe de controle de Acesso ao Sistema
 * @author 	alex.paula
 * @since 	26/02/2012
 * @version 1.0
 */
@ManagedBean
@ViewScoped
public class AcessoSistemaBean extends BaseBean {

	/**
	 * serialVersionUID
	 */
	private static final long serialVersionUID = 1L;
	
	/*
	 * Atributos
	 */
	private Usuario usuario;
	
	private UsuarioAlteraSenha usuarioAlteraSenha;
	
	@ManagedProperty("#{usuarioService}")
	private UsuarioService usuarioService;
	
	@ManagedProperty("#{linguaBean.currentLocale}")
	private Locale currentLocale;
	
	/*
	 * Getters e Setters
	 */
	public Usuario getUsuario() {
		return usuario;
	}
	
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public UsuarioAlteraSenha getUsuarioAlteraSenha() {
		return usuarioAlteraSenha;
	}

	public void setUsuarioAlteraSenha(UsuarioAlteraSenha usuarioAlteraSenha) {
		this.usuarioAlteraSenha = usuarioAlteraSenha;
	}

	public UsuarioService getUsuarioService() {
		return usuarioService;
	}

	public void setUsuarioService(UsuarioService usuarioService) {
		this.usuarioService = usuarioService;
	}

	public Locale getCurrentLocale() {
		return currentLocale;
	}

	public void setCurrentLocale(Locale currentLocale) {
		this.currentLocale = currentLocale;
	}

	/*
	 * Metodos
	 */
	@PostConstruct
	public void init(){
		
		verificaLingua();
		usuario = new Usuario();
		usuarioAlteraSenha = new UsuarioAlteraSenha();
		
	}
	
	/**
	 * Realiza o acesso ao sistema do Usuario
	 * @return {@link String}
	 */
	public String doLogin(){
		
		String sucesso 			= "sucesso";
		String erro    			= "erro";
//		String primeiroAcesso 	= "primeiro";
		
		try {
			
			// Verifica campos de Acesso ao Sistemas se estao preenchidos
			if(isCamposLoginValidos()) {
				
				// Realiza busca do Usuario
				usuario = usuarioService.acessarSistema(usuario);
				
				return sucesso;
				
			} else {
				throw new MRHErroException(getStringBolha(Mensagens.erroCamposObrigatorios));
			}
			
		} catch (MRHAlertaException e) {
			mensagemAlerta(e);
			return erro;
		} catch (MRHErroException e) {
			mensagemErro(e);
			return erro;
		}
		
	}
	
	/**
	 * Realiza a alteracao de senha
	 */
	public void doChangePassword() {
		
		try {
			
			// Verifica campos de Alteraca de Senha se estao preenchidos
			if(isCamposAlterarSenhaValidos()) {
				
				// Realiza alteracao de senha
				usuarioService.alterarSenha(usuarioAlteraSenha);
				
				// Limpa dados do Usuario
				doCleanUsuario();
				
				// Envia mensagem de sucesso 
				mensagemSucesso(getStringBolha(Mensagens.sucessoSenhaAlterada));
				
			} else {
				throw new MRHErroException(getStringBolha(Mensagens.erroCamposObrigatorios));
			}
			
		} catch (MRHAlertaException e) {
			mensagemAlerta(e);
		} catch (MRHErroException e) {
			mensagemErro(e);
		}
	}
	
	/**
	 * Realiza a recuperacao de senha
	 */
	public void doRecoverPassword() {
		try {
			
			// Verifica campos de Alteraca de Senha se estao preenchidos
			if(isCamposRecuperarSenhaValidos()) {
				
				// Realiza recuperacao de senha
				usuarioService.recuperarSenha(usuario);
				
				// Limpa dados do Usuario
				doCleanUsuario();
				
				// Envia mensagem de sucesso 
				mensagemSucesso(getStringBolha(Mensagens.sucessoSenhaRecuperada));
				
			} else {
				throw new MRHErroException(getStringBolha(Mensagens.erroCamposObrigatorios));
			}
			
		} catch (MRHAlertaException e) {
			mensagemAlerta(e);
		} catch (MRHErroException e) {
			mensagemErro(e);
		}
	}
	
	/**
	 * Limpa dados do Usuario
	 */
	public void doCleanUsuario(){
		setUsuario(new Usuario());
		setUsuarioAlteraSenha(new UsuarioAlteraSenha());
	}

	@Override
	public void verificaLingua() {
		
		if(getCurrentLocale() == null)
			setCurrentLocale(Locale.getDefault());
		
		FacesContext.getCurrentInstance().getViewRoot()
		.setLocale(getCurrentLocale());
		
	}
	
	/**
	 * Verifica se campos para o Acesso ao Sistema sao validos
	 * @return {@link Boolean}
	 */
	private Boolean isCamposLoginValidos(){
		
		if(usuario.getCdUsuario().trim().isEmpty())
			return false;
		
		if(usuario.getCdSenha().trim().isEmpty())
			return false;
		
		return true;
	}
	
	/**
	 * Verifica se os campos para Alteracao de Senha sao validos
	 * @return {@link Boolean}
	 */
	private Boolean isCamposAlterarSenhaValidos(){
		
		if(usuarioAlteraSenha.getCdUsuario().trim().isEmpty())
			return false;
		
		if(usuarioAlteraSenha.getCdSenha().trim().isEmpty())
			return false;
		
		if(usuarioAlteraSenha.getCdNovaSenha().trim().isEmpty())
			return false;
		
		if(usuarioAlteraSenha.getCdConfirmaSenha().trim().isEmpty())
			return false;
		
		return true;
	}
	
	/**
	 * Verifica se os campos para Recuperacao de Senha sao validos
	 * @return {@link Boolean}
	 */
	private Boolean isCamposRecuperarSenhaValidos() {
		if(usuario.getCdUsuario().trim().isEmpty())
			return false;
		
		return true;
	}
}
